package JUC.AtomicLeiAPI;

import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;

/**
 * @author CKC
 * @DateTime 2021/6/3 21:21
 * <p>
 * 字段更新器(原子更新器)
 * AtomicIntegerFieldUpdater: 原子更新整型的字段的更新器。
 * AtomicLongFieldUpdater: 原子更新长整型字段的更新器。
 * AtomicStampedFieldUpdater: 原子更新带有版本号的引用类型。
 * AtomicReferenceFieldUpdater: 原子引用字段更新器
 * 注意：利用字段更新器，可以针对对象的某个域（Field）进行原子操作，只能配合 volatile 修饰的字段使用，否则会出现
 * 异常  Exception in thread "main" java.lang.IllegalArgumentException: Must be volatile type
 */
public class FieldUpdater {
    public static void main(String[] args) {
        IntegerFieldUpdater integerFieldUpdater = new IntegerFieldUpdater();
        System.out.println(integerFieldUpdater);
        AtomicIntegerFieldUpdater<IntegerFieldUpdater> updater = AtomicIntegerFieldUpdater.newUpdater(IntegerFieldUpdater.class, "i");
        updater.compareAndSet(integerFieldUpdater, 0, 12);
        System.out.println(integerFieldUpdater);

    }

    private static void dome1() {
        Student stu = new Student();
        AtomicReferenceFieldUpdater<Student, String> updater =
                AtomicReferenceFieldUpdater.newUpdater(Student.class, String.class, "name");
        /*参数一：类名  参数二：字段类型   参数三：字段的名字*/
        boolean flag = updater.compareAndSet(stu, null, "张三");
        System.out.println(flag + "\n" + stu);
    }
}

class Student {
    volatile String name;

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                '}';
    }
}

class IntegerFieldUpdater {
    volatile int i = 0;
    volatile Integer i1 = 0;// Integer类型 为什么不行？

    @Override
    public String toString() {
        return "IntegerFieldUpdater{" +
                "i=" + i +
                '}';
    }
}

